600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > Android设备接入阿里云IoT物联网平台——设备接入类

Android设备接入阿里云IoT物联网平台——设备接入类

时间:2021-08-20 22:31:33

相关推荐

Android设备接入阿里云IoT物联网平台——设备接入类

1. 准备工作

1.1 注册阿里云账号

使用个人淘宝账号或手机号,开通阿里云账号,并通过__实名认证(可以用支付宝认证)__

1.2 免费开通IoT物联网套件

产品官网​​/product/iot​​

1.3 软件环境

JDK安装

编辑器 IDEA

2. 开发步骤

2.1 云端开发

1) 创建高级版产品

2) 功能定义,产品物模型添加属性

添加产品属性定义

物模型对应属性上报topic

/sys/替换为productKey/替换为deviceName/thing/event/property/post

物模型对应的属性上报payload

{id: 123452452,params: {temperature: 26.2,humidity: 60.4},method: "thing.event.property.post"}

3) 设备管理>注册设备,获得身份三元组

2.2 设备端开发

我们以java程序来模拟设备,建立连接,上报数据。

1) build.gradle添加sdk依赖

dependencies {implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.0'}

2) AliyunIoTSignUtil工具类

import javax.crypto.Mac;import javax.crypto.SecretKey;import javax.crypto.spec.SecretKeySpec;import java.util.Arrays;import java.util.Map;/*** AliyunIoTSignUtil*/public class AliyunIoTSignUtil {public static String sign(Map<String, String> params, String deviceSecret, String signMethod) {//将参数Key按字典顺序排序String[] sortedKeys = params.keySet().toArray(new String[] {});Arrays.sort(sortedKeys);//生成规范化请求字符串StringBuilder canonicalizedQueryString = new StringBuilder();for (String key : sortedKeys) {if ("sign".equalsIgnoreCase(key)) {continue;}canonicalizedQueryString.append(key).append(params.get(key));}try {String key = deviceSecret;return encryptHMAC(signMethod,canonicalizedQueryString.toString(), key);} catch (Exception e) {throw new RuntimeException(e);}}/*** HMACSHA1加密**/public static String encryptHMAC(String signMethod,String content, String key) throws Exception {SecretKey secretKey = new SecretKeySpec(key.getBytes("utf-8"), signMethod);Mac mac = Mac.getInstance(secretKey.getAlgorithm());mac.init(secretKey);byte[] data = mac.doFinal(content.getBytes("utf-8"));return bytesToHexString(data);}public static final String bytesToHexString(byte[] bArray) {StringBuffer sb = new StringBuffer(bArray.length);String sTemp;for (int i = 0; i < bArray.length; i++) {sTemp = Integer.toHexString(0xFF & bArray[i]);if (sTemp.length() < 2) {sb.append(0);}sb.append(sTemp.toUpperCase());}return sb.toString();}}

3) 模拟设备MainActivity.java代码

public class MainActivity extends AppCompatActivity {private static final String TAG = MainActivity.class.getSimpleName();private TextView msgTextView;private String productKey = "";// 高级版产品keyprivate String deviceName = "";//已经注册的设备idprivate String deviceSecret = "";//设备秘钥//property post topicprivate final String payloadJson = "{\"id\":%s,\"params\":{\"temperature\": %s,\"humidity\": %s},\"method\":\"thing.event.property.post\"}";private MqttClient mqttClient = null;final int POST_DEVICE_PROPERTIES_SUCCESS = 1002;final int POST_DEVICE_PROPERTIES_ERROR = 1003;private Handler mHandler = new Handler() {@Overridepublic void handleMessage(Message msg) {switch (msg.what) {case POST_DEVICE_PROPERTIES_SUCCESS:showToast("发送数据成功");break;case POST_DEVICE_PROPERTIES_ERROR:showToast("post数据失败");break;}}};private String responseBody = "";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);msgTextView = findViewById(R.id.msgTextView);findViewById(R.id.activate_button).setOnClickListener((l) -> {new Thread(() -> initAliyunIoTClient()).start();});findViewById(R.id.post_button).setOnClickListener((l) -> {mHandler.postDelayed(() -> postDeviceProperties(), 1000);});findViewById(R.id.quit_button).setOnClickListener((l) -> {try {mqttClient.disconnect();} catch (MqttException e) {e.printStackTrace();}});}/*** 使用 productKey,deviceName,deviceSecret 三元组建立IoT MQTT连接*/private void initAliyunIoTClient() {try {String clientId = "androidthings" + System.currentTimeMillis();Map<String, String> params = new HashMap<String, String>(16);params.put("productKey", productKey);params.put("deviceName", deviceName);params.put("clientId", clientId);String timestamp = String.valueOf(System.currentTimeMillis());params.put("timestamp", timestamp);// cn-shanghaiString targetServer = "tcp://" + productKey + ".iot-as--:1883";String mqttclientId = clientId + "|securemode=3,signmethod=hmacsha1,timestamp=" + timestamp + "|";String mqttUsername = deviceName + "&" + productKey;String mqttPassword = AliyunIoTSignUtil.sign(params, deviceSecret, "hmacsha1");connectMqtt(targetServer, mqttclientId, mqttUsername, mqttPassword);} catch (Exception e) {e.printStackTrace();responseBody = e.getMessage();mHandler.sendEmptyMessage(POST_DEVICE_PROPERTIES_ERROR);}}public void connectMqtt(String url, String clientId, String mqttUsername, String mqttPassword) throws Exception {MemoryPersistence persistence = new MemoryPersistence();mqttClient = new MqttClient(url, clientId, persistence);MqttConnectOptions connOpts = new MqttConnectOptions();// MQTT 3.1.1connOpts.setMqttVersion(4);connOpts.setAutomaticReconnect(true);connOpts.setCleanSession(true);connOpts.setUserName(mqttUsername);connOpts.setPassword(mqttPassword.toCharArray());connOpts.setKeepAliveInterval(60);mqttClient.connect(connOpts);Log.d(TAG, "connected " + url);}/*** post 数据*/private void postDeviceProperties() {try {Random random = new Random();//上报数据String payload = String.format(payloadJson, String.valueOf(System.currentTimeMillis()), 10 + random.nextInt(20), 50 + random.nextInt(50));responseBody = payload;MqttMessage message = new MqttMessage(payload.getBytes("utf-8"));message.setQos(1);String pubTopic = "/sys/" + productKey + "/" + deviceName + "/thing/event/property/post";mqttClient.publish(pubTopic, message);Log.d(TAG, "publish topic=" + pubTopic + ",payload=" + payload);mHandler.sendEmptyMessage(POST_DEVICE_PROPERTIES_SUCCESS);mHandler.postDelayed(() -> postDeviceProperties(), 5 * 1000);} catch (Exception e) {e.printStackTrace();responseBody = e.getMessage();mHandler.sendEmptyMessage(POST_DEVICE_PROPERTIES_ERROR);Log.e(TAG, "postDeviceProperties error " + e.getMessage(), e);}}private void showToast(String msg) {msgTextView.setText(msg + "\n" + responseBody);}}

3. 启动运行

3.1 设备启动

3.2 云端查看设备运行状态

物联网平台产品介绍详情:​​/product/iot/iot_instc_public_cn​​

阿里云物联网平台客户交流群

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。