• [优秀博文] Linux centos7操作系统 Mysql数据库安装以及常见问题解决方案
    现在网上很多关于MySQL数据库安装教程新旧不一,并且由于centos系统版本不同,所用镜像源不同,很多解决方法已经不适用。这篇文章主要用于组内项目服务器开发过程展示总结,内容均为原创,转载请注明来源,文章中有纰漏之处还望斧正。当然如果能够帮助大家解决一些服务器搭建问题那就再好不过。1. MySQL安装过程中的常见问题MySQL依赖问题默认的rmp源不稳定下面我先给出MySQL安装的步骤及命令行代码,在遇到以上问题的时候我会给出解决方案。2. MySQL安装步骤依次执行下面三行代码:wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm yum -y install mysql57-community-release-el7-10.noarch.rpm yum -y install mysql-community-server --nogpgcheck centos7中默认安装有MariaDB,这个是MySQL的分支,但在安装完MySQL之后可以直接覆盖掉MariaDB。下面进行mysql的配置,执行以下命令,启动MySQL服务:systemctl start mysqld systemctl enable mysqld查看MySQL运行状态:systemctl status mysqld.service● mysqld.service - MySQL Server Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled) Active: active (running) since Tue 2022-05-17 17:19:25 CST; 1min 1s ago Docs: man:mysqld(8) http://dev.mysql.com/doc/refman/en/using-systemd.html Process: 656 ExecStart=/usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid $MYSQLD_OPTS (code=exited, status=0/SUCCESS) Process: 589 ExecStartPre=/usr/bin/mysqld_pre_systemd (code=exited, status=0/SUCCESS) Main PID: 837 (mysqld) CGroup: /system.slice/mysqld.service └─837 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid May 17 17:19:22 hecs-340553 systemd[1]: Starting MySQL Server... May 17 17:19:25 hecs-340553 systemd[1]: Started MySQL Server.执行以下命令,获取安装MySQL时自动设置的root用户密码:grep 'temporary password' /var/log/mysqld.log如果回显信息中密码为空,则说明没有自动设置密码,如果有自动设置密码,需要复制在下一步中使用。执行以下命令,并按照回显提示信息进行操作,加固MySQL:mysql_secure_installationSecuring the MySQL server deployment. Enter password for user root: #输入上一步骤中获取的安装MySQL时自动设置的root用户密码 The existing password for the user account root has expired. Please set a new password. New password: #设置新的root用户密码 Re-enter new password: #再次输入密码 The 'validate_password' plugin is installed on the server. The subsequent steps will run with the existing configuration of the plugin. Using existing password for root. Estimated strength of the password: 100 Change the password for root ? ((Press y|Y for Yes, any other key for No) : N #是否更改root用户密码,输入N ... skipping. By default, a MySQL installation has an anonymous user, allowing anyone to log into MySQL without having to have a user account created for them. This is intended only for testing, and to make the installation go a bit smoother. You should remove them before moving into a production environment. Remove anonymous users? (Press y|Y for Yes, any other key for No) : Y #是否删除匿名用户,输入Y Success. Normally, root should only be allowed to connect from 'localhost'. This ensures that someone cannot guess at the root password from the network. Disallow root login remotely? (Press y|Y for Yes, any other key for No) : Y #禁止root远程登录,输入Y Success. By default, MySQL comes with a database named 'test' that anyone can access. This is also intended only for testing, and should be removed before moving into a production environment. Remove test database and access to it? (Press y|Y for Yes, any other key for No) : Y #是否删除test库和对它的访问权限,输入Y - Dropping test database... Success. - Removing privileges on test database... Success. Reloading the privilege tables will ensure that all changes made so far will take effect immediately. Reload privilege tables now? (Press y|Y for Yes, any other key for No) : Y #是否重新加载授权表,输入Y Success. All done!执行以下命令,再根据提示输入数据库管理员root账号的密码进入数据库:mysql -u root -p执行以下命令,使用MySQL数据库:use mysql;执行以下命令,查看用户列表:select host,user from user;执行以下命令,mysql默认不允许远程主机,%表示允许所有主机连接。刷新用户列表并允许所有IP对数据库进行访问,方面后续使用数据库软件进行管理:update user set host='%' where user='root' LIMIT 1;执行以下命令,强制刷新权限。允许同一子网中设置为允许访问的云服务器通过私有IP对MySQL数据库进行访问:flush privileges;执行以下命令,退出数据库:quit执行以下命令,重启MySQL服务systemctl start mysqld执行以下命令,设置开机自动启动MySQL服务:systemctl enable mysqld执行以下命令,关闭防火墙:systemctl stop firewalld.service重新查看防火墙状态是否为关闭:systemctl status firewalld● firewalld.service - firewalld - dynamic firewall daemon Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled) Active: inactive (dead) Docs: man:firewalld(1)3.MySQL依赖问题出现依赖问题或版本冲突建议先将mysql相关文件全部删除,再重新进行mysql安装。yum remove mysql mysql-server mysql-libs mysql-server查找残留文件:rpm -qa | grep -i mysql将查询出来的文件逐个删除,这里需要用到删除命令,比如:yum remove mysql-community-common-5.7.29-1.el6.x86_64查找残留目录,如果有残留文件,再逐一删除(这样能将mysql文件删除干净,方面重新安装):whereis mysql rm –rf /usr/lib64/mysql 检测系统是否存在mysql:yum list installed|grep mysql删除完毕后重新按照以上流程按照即可。4. 默认的rmp源不稳定,如何进行rmp源更新给CentOS添加rpm源,并且选择较新的源:wget dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm --no-check-certificate yum localinstall mysql-community-release-el6-5.noarch.rpm yum repolist all | grep mysql yum repolist enabled | grep mysql查看可获得的mysql版本,进行下载:yum list | grep mysql yum -y install mysql-community-server然后在根据流程进一步操作即可。
  • 使用Paho-MQTT集成ID²,实现数据安全上云
    1. 简介:IoT设备身份认证(IoT Device ID,ID²)是物联网设备接入到系统时的设备身份标识和设备认证系统,通过可信计算和密码技术为物联网系统提供设备认证、传输通道加密、业务数据加密等端到端的可信接入能力。MQTT是一种基于发布/订阅模式的轻量级消息传输协议,专门针对低带宽和不稳定网络环境的物联网应用而设计,可以用极少的代码为联网设备提供实时可靠的消息服务。Eclipse Paho提供许多不同版本的MQTT Client以供不同平台使用,其中Paho Embedded-C是为嵌入式平台提供的MQTT开源实现。本文介绍如何基于Paho-MQTT集成IoT设备认证(ID²),通过身份认证、数据加密等功能,实现物联网数据安全上云。2. 基于阿里云物联网平台使用:本节说明在物联网设备(Linux)中通过Paho-MQTT集成IoT设备身份认证设备端SDK并接入阿里云物联网平台,通过身份认证、通道加密等功能,实现物联网数据安全上云。2.1 创建产品:只有认证方式为ID²的产品才可以使用IoT设备身份认证的服务,接下来我们需要创建一个新的产品并指定认证方式为ID²。前提条件:拥有阿里云物联网平台实例(华东2上海region)。具有IoT设备身份认证的认证授权, 可通过阿里云免费试用,或者购买ID²认证授权。登录产品控制台,在左侧导航栏,选择常规>集成与部署 > IoT设备身份认证,单击组合使用(与阿里云物联网平台)卡片的开始接入按钮。​在配置产品页面创建新产品&分配ID²授权,然后单击下一步按钮。请选择新增产品,并输入产品名称。ID²有效期:免费试用、或者付费授权。分配ID²授权数量:请输入ID²授权数量。2.2 选择设备认证算法:IoT设备身份认证支持国际算法(AES-128、AES-192、AES-256)和国密算法(SM1-128、SM2-256、SM4-128),能满足企业不同安全等级的需求。说明:国密算法SM1需要配合ID²安全芯片使用,SM2用于业务数据完整性校验和加密。ID²新增产品中默认选择的设备认证算法是AES-128;如需选择其他设备认证算法,请按如下步骤操作:在产品控制台,选择常规>集成与部署 > IoT设备身份认证,单击独立使用(三方物联网平台)卡片的开始接入按钮。在配置产品页面获取配置信息,然后单击下一步按钮。选择产品:请选择现有产品,在下拉框中勾选产品名称。在获取配置信息页面,单击设备认证算法后的更换按钮,查看支持的密钥类型(如SM4-128),并确认。在产品详情页面,记录下实例ID、ProductKey、ProductSecret。实例ID:阿里云物联网平台的实例标识。企业实例ID是字符串,公共实例ID是符号“-”。ProductKey:设备所属产品的ProductKey。ProductSecret:由IoT设备身份认证颁发的产品密钥,与 ProductKey 成对出现。2.3  集成设备端SDK:下载设备端SDK:执行wget命令获取设备端SDK:wget https://id2-schip-daily.oss-cn-shanghai.aliyuncs.com/static_resources/ID2_Client_SDK.tar执行命令tar -xvf ID2_Client_SDK.tar完成解压,执行命令cd <解压SDK后的目录>。设备端SDK的目录说明见表格内容:目录/文件说明demosID²设备端的示例代码:lpdemo:提供通过MQTT组件使用ID²连接到阿里云物联网平台的演示示例。paho:基于Paho MQTT开源组件的示例代码。external用于存放外部的组件:mqtt - MQTT的组件paho:存放Eclipse Paho embdded-c的源码。includeID²的头文件目录libsID²的静态库make.rules编译规则文件,可配置编译工具链和编译参数make.settings编译配置文件,可配置ID²的密钥类型(如AES、SM4)makefile编译脚本srcID²的源码目录testsID²的测试用例,包括HAL和ID²的测试。toolsID²的本地工具/脚本:ls_lp_demo.sh:与阿里云物联网平台组合使用场景中的设备端演示示例。集成设备端SDK:1. 设备硬件及系统层集成。适配接口说明请参考ID²设备端SDK适配接口,包括:OSA接口适配:实现src/osa/ls_osa.c中的接口。HAL接口适配:实现src/hal/km/demo/ls_hal_km.c中的接口,通过hal_test测试用例验证(成功日志:“HAL KM Test Pass”)。2. 设备连接通道层集成。使用默认的Paho SDK,请跳过此步骤。下载Paho Embedded-C SDK,并且拷贝其中的源码到external/mqtt/paho/paho_embedded_c目录git clone cid:link_153. 设备应用层集成。设备接入域名(mqtt_host)、MQTT服务器端口的配置:设备接入域名:${YourProductKey}.itls.cn-shanghai.aliyuncs.com,其中${YourProductKey}为IoT设备身份认证产品的ProductKeyMQTT服务器端口:1883生成阿里云物联网平台MQTT Connect的参数:MQTT客户端的标识 - ClientId:# 使用物联网平台的企业实例deviceId+"|securemode=8,signmethod=hmacsha1,timestamp=2524608000000,authtype=id2[,instanceId=xxx]|"deviceId:${deviceName}  + “&” + ${productKey}instanceId:填写物联网平台的企业实例ID,如使用公共实例(短横线‘"-"),此字段忽略掉MQTT客户端的用户名 - UserName:# 由设备标识和产品标识组合而成${deviceName} + “&” + ${productKey}MQTT客户端的密码 - Password:# 64字节长度的全0字符串"0000000000..000"适配Paho的网络抽象接口:更新Network的结构体,且重新实现Network的接口,参考实现如下:#include "hal_itls.h"typedef struct Network { char *product_key; char *product_secret; uintptr_t handle; int my_socket; int (*mqttread) (struct Network*, unsigned char*, int, int); int (*mqttwrite) (struct Network*, unsigned char*, int, int);} Network;int mqtt_itls_read(Network* n, unsigned char* buffer, int len, int timeout_ms) { return hal_itls_read(n->handle, buffer, len, timeout_ms);}int mqtt_itls_write(Network* n, unsigned char* buffer, int len, int timeout_ms){ return hal_itls_write(n->handle, buffer, len, timeout_ms);}void NetworkSetConfig(Network* n, char *product_key, char *product_secret) { n->product_key = product_key; n->product_secret = product_secret;}void NetworkInit(Network* n) { n->handle = 0; n->mqttread = mqtt_itls_read; n->mqttwrite = mqtt_itls_write;}int NetworkConnect(Network* n, char* addr, int port) { n->handle = hal_itls_establish(addr, port, n->product_key, n->product_secret); if (n->handle == 0) { return -1; } return 0;}void NetworkDisconnect(Network* n) { hal_itls_destroy(n->handle);}4. 设备端SDK的编译。在ID² SDK的根目录,执行命令vi ./make.settings打开文件,修改如下参数:配置CONFIG_LS_ID2_KEY_TYPE,选择同ID²产品选择的认证算法保持相同配置CONFIG_LS_ID2_MQTT_NAME,选择使用Paho执行命令 vi demos/lpdemo/paho/mqtt_id2_demo.c打开文件,配置mqtt_id2_demo.c示例中的参数:如选择使用Link SDK时,执行命令 vi demos/mqtt/lk/mqtt_id2_demo.c打开文件:ProductKey:ID²产品的ProductKey。ProductSecret:ID²产品的ProductSecret。DeviceName:自定义,同一个产品下唯一。LP_Instance_ID:填写在ID²产品详情中获得的企业实例ID字符串;如果是公共实例,填写NULL执行命令“make clean & make plat=xxx”进行编译Linux x86_64默认使用系统中的GCC作为编译工具,且默认指定“plat=x86_64”参数如要编译其他架构,如armhf,在make.rules中配置编译工具,运行编译命令“make clean & make plat=armhf”2.4 安全接入:在完成设备端集成的基础上,运行设备应用,  或者演示示例接入阿里云物联网平台。1. 使用演示示例:在Linux x86_64设备上下载ID² SDK,执行命令vi ./make.settings打开文件。配置CONFIG_LS_ID2_KEY_TYPE,选择同ID²产品选择的认证算法保持相同修改CONFIG_LS_ID2_MQTT_NAME的值为Paho执行命令make clean & make进行编译。编辑vi tools/ls_lp_demo.sh填写如下参数:ProductKey:ID²产品的ProductKey。ProductSecret:ID²产品的ProductSecret。DeviceName:自定义,同一个产品下唯一。InstanceId:填写在ID²产品详情中获得的企业实例ID字符串,如公共实例ID:“-”。执行命令./tools/ls_lp_demo.sh运行设备端演示示例,查看设备端打印的日志。在日志中,可以看到此设备上的ID² ID(“ 000FF...”)基于ID²进行设备和LP平台之间的双向认证(“Verify iTLS Server AuthCode OK”),并建立设备和LP平台的TLS安全传输通道(ID²-iTLS);MQTT消息开始基于TLS通道进行加密传输(“Start to use itls to encrypt message buffer”)2. 查看设备状态:登录产品控制台,在左侧导航栏,选择资产>设备,查看设备状态为正常,安全状态为安全。3.  基于自建的物联网平台使用:本节说明在物联网应用中集成ID²云端SDK、在物联网设备(Linux)中通过Paho-MQTT集成ID²设备端SDK,通过身份认证、业务数据加密等功能,实现物联网数据安全上云。3.1 创建产品:本章节描述了如何在IoT设备身份认证控制台创建产品并分配授权额度,包括:创建产品分配授权额度前提条件:具有IoT设备身份认证的认证授权, 可通过阿里云免费试用,或者购买ID²认证授权。1. 登录产品控制台,在左侧导航栏,选择常规>集成与部署 > IoT设备身份认证,单击独立使用(三方物联网平台)卡片的开始接入按钮。2. 在配置产品页面创建新产品&分配ID²授权,然后单击下一步按钮。选择产品:请选择创建新产品,并输入产品名称。ID²有效期:免费试用、或者付费授权。分配ID²授权数量:请输入ID²授权数量。3.2 选择设备认证算法:IoT设备身份认证支持国际算法(AES-128、AES-192、AES-256)和国密算法(SM1-128、SM2-256、SM4-128),能满足企业不同安全等级的需求。说明:国密算法SM1需要配合ID²安全芯片使用,SM2用于业务数据完整性校验和加密。ID²新增产品中默认选择的设备认证算法是AES-128;如需选择其他设备认证算法,请按如下步骤操作:1. 在查看配置信息页面,选择设备认证算法为SM4-128,单击提交按钮。2. 在查看配置信息页面,您需要记录下ProductKey、ProductSecret。ProductKey:设备所属产品的ProductKey。ProductSecret:由IoT设备身份认证颁发的产品密钥,与 ProductKey 成对出现。3. 单击下一步按钮进入集成云端SDK页面。3.3 集成云端SDK: 阿里云账号的AccessKey:AccessKey是调用阿里云API的身份凭证,请参见获取AccessKey。需要注意的是AccessKey的归属账号必须与创建产品时的账号保持一致。下载云端SDK:1. 执行wget命令获取云端SDK:wget https://id2-schip-daily.oss-cn-shanghai.aliyuncs.com/static_resources/ID2_Server_SDK.tar2. 在云端环境执行命令tar -xvf ID2_Server_SDK.tar 完成解压,执行命令cd <解压SDK后的目录>。设备端SDK的目录说明见表格内容:目录/文件说明demosID²云端的示例代码libID²云端的Jar包集成云端SDK:1. 添加Maven项目依赖,引入阿里云Java SDK公共包。<dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-core</artifactId> <version>4.5.6</version></dependency>2. 导入云端SDK中的lib/aliyun-java-sdk-id2-1.1.4.jar到项目工程中,初始化云端SDK。public static String ACCESS_KEY = null;public static String ACCESS_SECRET = null;public static String REGION_ID = "cn-shanghai";public static String END_POINT = "id2." + REGION_ID + ".aliyuncs.com";// Load ACCESS_KEY and ACCESS_SECRET From Config FileloadConfigProperties("xxx.conf");IClientProfile profile = DefaultProfile.getProfile(REGION_ID, ACCESS_KEY, ACCESS_SECRET);DefaultProfile.addEndpoint(REGION_ID, PRODUCT_CODE, END_POINT);client = new DefaultAcsClient(profile);3. 发起调用,ID²云端SDK为每个API封装了一个类,命名为${API名称}+"Request",如VerifyRequest,用于API的调用请求,ID²云端API列表请参考ID²云端API手册。ID²空发OtpGetId2Request request = new OtpGetId2Request();request.setDeviceAuthCode(authCode);request.setApiVersion(1.1.2);OtpGetId2Response response = client.getAcsResponse(request);获取ID²认证挑战字GetServerRandomRequest request = new GetServerRandomRequest();request.setId2(id2Id);request.setApiVersion(1.1.2);GetServerRandomResponse response = client.getAcsResponse(request);System.out.println("GetServerRadom requestId:" + response.getRequestId());ID²设备认证和业务密钥加密VerifyAndEncryptRequest request = new VerifyAndEncryptRequest();request.setApiVersion(1.1.2);request.setProductKey(productKey);request.setId2(id2Id);request.setAuthCode(authCode);request.setData(keyInfo);VerifyAndEncryptResponse response = client.getAcsResponse(request);System.out.println("VerifyAndEncrypt requestId:" + response.getRequestId());4. 应用集成ID²云端SDK的示例代码,请参考demos/ID2SPDemo3.4 集成设备端SDK:下载设备端SDK:1. 执行wget命令获取设备端SDK:wget https://id2-schip-daily.oss-cn-shanghai.aliyuncs.com/static_resources/ID2_Client_SDK.tar2. 执行命令tar -xvf ID2_Client_SDK.tar完成解压,执行命令cd <解压SDK后的目录>。设备端SDK的目录说明见表格内容:目录/文件说明demosID²设备端的示例代码:spdemo:提供独立使用ID²的演示示例external用于存放外部的组件:mqtt - MQTT的组件paho:存放Eclipse Paho embdded-c的源码。includeID²的头文件目录libsID²的静态库make.rules编译规则文件,可配置编译工具链和编译参数make.settings编译配置文件,可配置ID²的密钥类型(如AES、SM4)makefile编译脚本srcID²的源码目录testsID²的测试用例,包括HAL和ID²的测试。toolsID²的本地工具/脚本:ls_sp_demo.sh:独立使用场景中的设备端演示示例集成设备端SDK:1. 设备硬件及系统层集成,详情请参考ID²设备端SDK适配接口OSA接口适配:实现src/osa/ls_osa.c中的接口。HAL接口适配:实现src/hal/km/demo/ls_hal_km.c中的接口,通过hal_test测试用例验证(成功日志: “HAL KM Test Pass”)。2. 设备应用层集成,详情请参考ID²设备端API手册设备应用首先调用ID²的初始化函数,完成设备端SDK的初始化。{ int ret; ret = id2_client_init(); if (ret != IROT_SUCCESS) { ls_osa_print("id2 client init fail, %d\n", ret); return -1; }}获取ID²设备端的烧录状态:如ID²已烧录(is_prov == true),退出ID²空发流程{ int ret = 0; bool is_prov = false; ret = id2_client_get_prov_stat(&is_prov); if (ret != IROT_SUCCESS) { ls_osa_print("id2 client get prov stat fail, %d\n", ret); return -1; } }生成ID²设备端的空发认证码。{ int ret = 0; uint8_t auth_code[ID2_MAX_AUTH_CODE_LEN] = {0}; uint32_t auth_code_len = ID2_MAX_AUTH_CODE_LEN; ret = id2_client_get_otp_auth_code( (uint8_t *)product_secret, (int)strlen(product_secret), auth_code, &auth_code_len); if (ret != IROT_SUCCESS) { ls_osa_print("id2_client_get_otp_auth_code fail, %d\n", ret); return -1; }}ID²空发的网络请求和响应。authCode:ID²空发认证码的Base64编码otpData:ID²云端下发的空发数据(Base64格式)# ID²空发请求:{commandId:xxx, authCode: xxx}# ID2空发响应:{commandId:xxx, otpData: xxx}存储ID²密钥到设备安全存储区。{ int ret = 0; ret = id2_client_load_otp_data(otp_data, otp_len); if (ret != IROT_SUCCESS) { ls_osa_print("id2 load otp data fail, %d\n", ret); return -1; }}获取设备端的ID² ID。{ int ret = 0; uint8_t id2_id[ID2_ID_MAX_LEN + 1] = {0}; uint32_t id2_id_len = ID2_ID_MAX_LEN; ret = id2_client_get_id(id2_id, &id2_id_len); if (ret != IROT_SUCCESS) { ls_osa_print("id2 client get id fail, %d\n", ret); return -1; }}ID²认证挑战字的网络请求和响应。# ID²认证挑战字的请求:{commandId:xxx, Id2Id: xxx}# ID2认证挑战字的响应:{commandId:xxx, challenge: xxx}获取设备端的ID²认证码。{ int ret = 0; uint8_t auth_code[ID2_MAX_AUTH_CODE_LEN] = {0}; uint32_t auth_code_len = ID2_MAX_AUTH_CODE_LEN; ret = id2_client_get_challenge_auth_code( challenge, NULL, 0, auth_code, &auth_code_len); if (ret != IROT_SUCCESS) { ls_osa_print("id2 client get challenge auth code fail, %d\n", ret); return -1; }}设备端认证和数据加密的网络请求和响应。cipherData:ID²云端下发的加密数据# ID²设备认证和数据加密的请求:{commandId:xxx, productKey:xxx, Id2Id:xxx, authCode:xxx}# ID2设备认证和数据加密的响应:{commandId:xxx, cipherData: xxx}解密ID²云端加密下发的数据。{ int ret = 0; ret = id2_client_decrypt(cipher_data, cipher_len, cipher_data, &cipher_len); if (ret != IROT_SUCCESS) { ls_osa_print("id2 client decrypt fail\n"); return -1; }}应用集成ID²设备SDK的示例代码,请参考demos/spdemo3. 设备端SDK的编译:在ID² SDK的根目录,执行命令vi ./make.settings打开文件, 修改CONFIG_LS_ID2_KEY_TYPE的值同ID²产品选择的认证算法保持相同执行命令“make clean & make plat=xxx”进行编译Linux x86_64默认使用系统中的GCC作为编译工具,且默认指定“plat=x86_64”参数如要编译其他架构,如armhf,在make.rules中配置编译工具,运行编译命令“make clean & make plat=armhf”3.5 业务数据加密:在完成设备端集成的基础上,运行设备应用,  或者使用演示示例,进行ID²认证和加密,以及业务数据加密的调试。1. 使用演示示例:部署EMQX物联网平台,详情参见EMQX安装和部署本节描述在Ubuntu 22.04上通过Docker部署EMQX物联网平台的示例安装和启动Docker工具:# Install Dockercurl -fsSL get.docker.com -o get-docker.shsudo sh get-docker.sh --mirror Aliyun# Start Dockersudo systemctl enable dockersudo systemctl start docker# Get Docker Versiondocker -v使用Docker安装EMQX物联网平台:# Get emqx-5.1.3 docker imagedocker pull emqx/emqx:5.1.3# Start docker emqx instancedocker run -d --name emqx -p 1883:1883 emqx/emqx:5.1.3# Get docker instance infodocker ps部署云端演示示例,在ID²云端SDK根目录,配置vi demos/ID2SPMessage/Id2SpDemo.conf文件中的AccessKey和AccessSecret信息。执行命令cd demos/ID2SPMessage,执行命令java -jar Id2SpDemo.jar启动云端演示示例。在ID²设备端SDK目录,执行命令vi tools/ls_sp_demo.sh填写如下参数:HostAddr:云端演示示例的IP地址,localhost代表本机网络。ProductKey:ID²产品的ProductKey。ProductSecret:ID²产品的ProductSecret。PublishData:设备端应用上报的业务数据,建议不超过1024字节。执行命令./tools/ls_sp_demo.sh运行设备端演示示例,查看设备端打印的日志。在设备端日志中,可以看到完成ID²的设备认证,以及通过ID²加密下发SP Key Info;设备端通过ID²设备端接口解密后,获得明文的Key ID和Data在设备端日志中,可看到由SPKey加密下发的业务数据(“SP Server Subscribed Cipher Data”);通过在调用SPKey解密后,可得到明文的下行业务数据(“SP_Server_Hello”)在云端查看打印的日志。可看到由SPKey加密的业务数据("Device Published Cipher Data")使用SPKey解密后,可得到正确的上行业务数据(“SP_Client_Hello”)2. 查看设备状态:登录产品控制台,在左侧导航栏,选择资产>设备,查看设备状态为正常,安全状态为安全。3. 延申阅读:IoT设备身份认证产品试用,请查看IoT设备身份认证免费试用常见问题以及处理方案,请查看常见问题。使用虚拟机模拟物联网设备,请查看最佳实践。在实际业务环境中使用ID²的最佳实践,请查看最佳实践。在Android、RTOS设备中使用IoT设备身份认证,请查看最佳实践。IoT设备身份认证的计量计费规则说明,请查看计费说明。
  • [常见FAQ] 本地运行和服务器运行不一致
    本地四张地图都能够正常运行,但是到了服务器上有一张地图没有得分。除此之外,服务器的运行分数普遍比本地要低一些,这是为什么呀
  • [openEuler] intel ixgbe驱动在openeuler22.03-LTS上编译安装
    1.官网下载驱动源码包地址:cid:link_0环境 openeuler22.03-LTS x86 aarch642.tar -xvf ixgbe-5.16.5.tar.gz3.把附件中的文件替换解压出来的文件文件 ixgbe_ethtool.c      路径  ixgbe-5.16.5/src/4.cd ixgbe-5.16.5/src/5.make install
  • [问题求助] UINT8和FP16,FP32
    请问使用atc进行模型编译时,output_shape的三个选项UINT8和FP16,FP32。其中的UINT8是代表模型量化吗?这三者的推理速度谁应该更快呢?
  • [技术干货] Go应用迁移
    HCIP-Kunpeng Application Developer考证体验——Go应用迁移第一步购买服务器本次实验需要在两个不同的平台运行GO应用程序,需要两个不同的服务器首先先看看两个服务器的基础配置x86服务器:1、x86计算2、通用计算增强型3、c6.latge.2 2vCPUs | 4GB,openEuler 20.03 64bit鲲鹏服务器:1、鲲鹏计算2、鲲鹏通用计算增强型3、kc1.2xlarge.2 8vCPUs | 16GB,Ubuntu 18.04 server 64bit with ARM尝试在x86服务器上运行GO Wed服务器首先安装GO可能有些人会将两台服务器弄混,使用以下命令可以查看系统信息uname -a1、下载GO软件包,命令行输入以下命令https://kunpeng-ip.obs.cn-north-4.myhuaweicloud.com/实验资源/3.2%20Goè¯­è¨€ä»£ç ç§»æ¤/go1.15.3.linux-amd64.tar.gz2、将下载好的软件包解压到指定的目录,输入如下命令,这里解压到/usr/local目录下tar -C /usr/local -xzvf go1.15.3.linux-amd64.tar.gz3、为GO添加环境变量,编辑文档/etc/profilevim /etc/profile在文件的最后添加上如下的代码(根据自己解压位置编写)export GOPATH=/usr/local/goexport PATH=$PATH:/usr/local/go/bin然后返回到根目录使配置生效:source /etc/profile4、使用命令验证go 安装成功go version可以返回以下版本信息表明安装成功go version go1.15.3 linux/amd64在Web服务上运行go应用1、在根目录下创建go文件,命名为hello-world.go,开始编写go程序vim hello-world.go2、输入以下简单代码作为第一个简单运用package mainimport ("fmt""net/http")func main() {http.HandleFunc("/", HelloServer)http.ListenAndServe(":8080", nil)}func HelloServer(w http.ResponseWriter, r *http.Request) {fmt.Fprintf(w, "Hello, %s!", r.URL.Path[1:])}3、运行go文件,注意不要停止运行go run hello-world.go4、使用本地浏览器访问x86 ECS的EIP:8080/{string},如http://EIP:8080/x86。其中{string}可以替换为任意字符串,EIP代表ecs的公网地址Build Web服务器1、使用CTRL+c停止web服务器2、查看编译过程go build -x hello-world.go主要的编译过程如下WORK=/tmp/go-build389519517mkdir -p $WORK/b001/cat >$WORK/b001/importcfg.link << 'EOF' # internalpackagefile command-line-arguments=/root/.cache/go-build/b6/b6b1dd0c1f72d9a5d4fee29a84b4b03b5e11311a7bf56f9a3c8763fefbf0207c-dpackagefile fmt=/usr/local/go/pkg/linux_amd64/fmt.apackagefile net/http=/usr/local/go/pkg/linux_amd64/net/http.a…packagefile unicode/utf16=/usr/local/go/pkg/linux_amd64/unicode/utf16.aEOFmkdir -p $WORK/b001/exe/cd ./usr/local/go/pkg/tool/linux_amd64/link -o $WORK/b001/exe/a.out -importcfg $WORK/b001/importcfg.link -buildmode=exe -buildid=SorAHn0T2Skvlp1JWBKs/R3Uv0wV9aW3nbbiABvZ5/Ls8w5Ac4hNlunE_gSND6/SorAHn0T2Skvlp1JWBKs -extld=gcc /root/.cache/go-build/b6/b6b1dd0c1f72d9a5d4fee29a84b4b03b5e11311a7bf56f9a3c8763fefbf0207c-d/usr/local/go/pkg/tool/linux_amd64/buildid -w $WORK/b001/exe/a.out # internalcp $WORK/b001/exe/a.out hello-worldrm -r $WORK/b001/3、查看文件,生产了hello-world4、运行可执行文件./hello-world5、使用本地浏览器访问x86 ECS的EIP:8080/{string},EIP代表x86服务器的私网ip使用ctrl+c停止web服务器在鲲鹏云服务器运行Go Web服务器安装GO1、下载GO安装包wget https://kunpeng-ip.obs.cn-north-4.myhuaweicloud.com/实验资源/3.2%20Goè¯­è¨€ä»£ç ç§»æ¤/go1.15.3.linux-amd64.tar.gz2、解压到指定的目录下tar -C /usr/local -xzvf go1.15.3.linux-arm64.tar.gz3、安装上一个服务器的配置添加环境变量vim /etc/profile在文件最后添加如下配置export PATH=$PATH:/usr/local/go/binexport GOROOT=/usr/local/goexport GOPATH=$HOME/goexport PATH=$PATH:$GOPATH/bin返回根目录,使用如下命名使配置生效:source /etc/profile4、验证GO是否安装成功go version如果返回版本信息代表安装成功go version go1.15.3 linux/arm64运行Web服务器1、从x86服务器拷贝可执行文件到鲲鹏ecsscp root@EIP:/root/hello-world /root/ (EIP代表x86服务器的私网ip)这里直接拷贝到了根目录下第一个红框位置,输入YES后按回车;第二个红框位置,输入x86的root密码后按回车。使用命令查看文件已经拷贝到鲲鹏服务器ll2、运行可执行文件./hello-world会发现在这里会报错,这是因为x86和鲲鹏平台差异导致执行格式错误,无法执行x86的二进制文件,需要在鲲鹏平台重新编译源码。Build web服务器1、从x86拷贝源码文件,同样拷贝到根目录下scp root@EIP:/root/hello-world.go /root/2、重新编译源码,这里注意这次编译将编译后的文件命名为hello-world-kpgo build -x -o hello-world-kp hello-world.go主要的编译过程WORK=/tmp/go-build858683415mkdir -p $WORK/b001/cat >$WORK/b001/importcfg.link << 'EOF' # internalpackagefile command-line-arguments=/root/.cache/go-build/a8/a813454c9a5fa88725dce14a80aa5dcf0e8a86c23b87c8085aec03a3173c4495-dpackagefile fmt=/usr/lib/golang/pkg/linux_arm64/fmt.apackagefile net/http=/usr/lib/golang/pkg/linux_arm64/net/http.a…packagefile vendor/golang.org/x/text/transform=/usr/lib/golang/pkg/linux_arm64/vendor/golang.org/x/text/transform.aEOFmkdir -p $WORK/b001/exe/cd ./usr/lib/golang/pkg/tool/linux_arm64/link -o $WORK/b001/exe/a.out -importcfg $WORK/b001/importcfg.link -buildmode=exe -buildid=XFj__tL-9CaZ6vOMXHrY/qWDDtRnClpz5sw1UnAQT/qu7Q7CWlnhkC24dw2YLs/XFj__tL-9CaZ6vOMXHrY -extld=gcc /root/.cache/go-build/a8/a813454c9a5fa88725dce14a80aa5dcf0e8a86c23b87c8085aec03a3173c4495-d/usr/lib/golang/pkg/tool/linux_arm64/buildid -w $WORK/b001/exe/a.out # internalcp $WORK/b001/exe/a.out hello-world-kprm -r $WORK/b001/3、查看文件ll4、这里试着运行新编译的hello-world-kp文件 ./hello-world-kp5、浏览器访问鲲鹏ecs的EIP:8080/{string}