随笔 - 2649  文章 - 2452  评论 - 0  阅读 - 74060

辅助工具

辅助工具

为了方便验证设备接入的流程,我们提供了一些工具来帮助开发者生成密钥和设备签名,包括 shell 和 Java 两个版本。

注意:这里的工具仅用于协助开发者验证流程和演示相关算法,只适合调试使用和开发参考,不推荐用于生产环境。建议开发者根据自己的使用场景进行二次开发。

1. 获取工具

  • 建议在 Linux 或 Mac OS 环境下使用。请先确认你的本机环境有 OpenSSL,建议使用 v1.1.1 版本。
  • 设备签名应在设备出厂前内置到设备中的安全区域,或是服务端签名完成后下发到设备使用。请不要在设备端进行签名流程。

shell 脚本示例代码

Shell 脚本下载地址

Java 示例代码

可以通过下列方式集成

此外,还需要在你的项目中添加下列依赖

  • org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.3.72
  • com.squareup.okhttp3:okhttp:4.7.2
  • com.google.code.gson:gson:2.8.6
  • org.jetbrains.kotlin:kotlin-stdlib-common:1.3.72

2. 密钥生成

生成的公钥需上传到微信终端合作平台换取 KeyVersion ,私钥将用于生成设备签名。

shell

sudo bash ./mmiot_ecdsa_sign.sh gen_ecdsa_key prikey_filepath pubkey_filepath

例如: img

执行成功后,终端输出 gen_ecdsa_key succ prikey_path:prikey_filepaht pubkey_path:pubkey_filepath,且在对应目录已生成两个文件,分别保存公钥与私钥。

Java

  // 设置该脚本的工作目录
  WmpfDeviceSignUpUtil.workingDir = System.getProperty("java.io.tmpdir")
  // 生成公私钥
  // 如果你已经有一对公私钥,分别将公私钥的文件名命名为 wmpfPublicKeyPath.key 和 wmpfPrivateKeyPath.key,放在 workingDir 下面即可,脚本会自动读取
  // 如果 workingDir 下没有找到公私钥,脚本会自动生成一组
  val (privateKey, publicKey) = WmpfDeviceSignUpUtil.getPrivateKeyPublicKeyPair()
  println("private key = [$privateKey]")
  println("public key = [$publicKey]")

3. 生成设备签名

shell

调用 mmiot_ecdsa_sign 工具,输入 ProductId、deviceId、私钥文件,生成每个设备的签名 Signature 。

sudo bash ./mmiot_ecdsa_sign.sh gen_ecdsa_sign ProductId my_deivice_id prikey_filepath sign_filepath

sign_filepath 是你想要输出 Signature 的路径,比如 /Users/mine/Desktop/sign/sign_file路径是输出到文件,而不是文件夹

例如:

img

可以看到,执行工具后,终端输出gen_ecdsa_sign succ sign_file_path:sign_filepath,且在对应路径下生成了该设备的签名文件。

校验设备签名

sudo bash ./mmiot_ecdsa_sign.sh verify_ecdsa_sign ProductId my_device_id pubkey_filepath sign_filepath

例如: img

Java

  val productId = "your-product-id-from-we-cooper"
  val deviceId = "your-customized-device-id"
  // TODO 上传公钥到「微信终端合作平台」
  // 获取Signature
  val signature = WmpfDeviceSignUpUtil.getSignature(
  productId,
  deviceId,
  privateKey
)
  println("signature = [$signature]")
  // 校验签名
  if (
    WmpfDeviceSignUpUtil.verifySignature(
      productId,
      deviceId,
      publicKey,
      signature
    )
  ) {
    println("verifySignature success")
  } else {
    println("verifySignature fail")
  }

4. 注册设备

Java 示例代码还提供了通过微信后台注册设备的参考实现。

Java

  val deviceInfo = DeviceInfo()
  deviceInfo.model_name = "your-model-name"
  deviceInfo.product_id = productId
  deviceInfo.device_id_list = Array(1) { deviceId }.toList()
  // 获取 accessToken
  // 入参:微信开放平台注册的移动应用 appId,移动应用 appSecret
  val accessTokenResp =
  WmpfDeviceSignUpUtil.getAccessToken("your-app-id", "your-app-secret")
  if (accessTokenResp.errcode == 0) {
    println("access token [${accessTokenResp.access_token}] expires = " + accessTokenResp.expires_in)
      // 添加设备信息到微信后台
      val resp = WmpfDeviceSignUpUtil.addDevicesToWeChatServer(
      accessToken = accessTokenResp.access_token,
      deviceInfo = deviceInfo
    )
    if (resp.errcode == 0) {
      println("addDevicesToWeChatServer resp success")
    }
  } else {
    println("get access token fail code = ${accessTokenResp.errcode}, msg = ${accessTokenResp.errmsg}")
  }
posted on   AtlasLapetos  阅读(2)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示