2.Eclipse-Hono使用入门
Hono由一组部署为Docker容器的微服务组成。下图概述了Hono Sandbox部署中的容器。
Hono架构介绍
Hono Instance
- HTTP Adapter : HTTP适配器实例将Hono的遥测和事件API作为URI资源
- MQTT Adapter : MQTT适配器实例,将Hono的遥测和事件API视为通用MQTT主题层次结构
- AMQP Adapter : 将Hono的遥测和事件API作为一组AMQP 1.0地址公开
- Command Router : 用于接收命令和控制消息并将其转发到协议适配器
- Device Registry : 设备注册表实例,用于管理注册信息并向协议适配器发出设备注册声明
- Auth Server : 身份验证服务器实例,用于验证荣誉组件并颁发标识和权限的令牌。
使用Kafka适配器
如果要使用Kafka作为消息传递在本地计运行的Hono需要以下条件
-
一个单节点的Minikube集群
-
确保运行
minikube tunnel
以支持创建类型LoadBalancer的Kubernetes服务 -
根据Eclipse Hono README.md 中的说明将Hono安装到本地的Minikube集群中
-
Hono部署到本地集群后,运行以下命令创建Hono。之后将使用env文件来设置和刷新一些环境变量:
echo "export REGISTRY_IP=$(kubectl get service eclipse-hono-service-device-registry-ext --output="jsonpath={.status.loadBalancer.ingress[0]['hostname','ip']}" -n hono)" > hono.env
echo "export HTTP_ADAPTER_IP=$(kubectl get service eclipse-hono-adapter-http --output="jsonpath={.status.loadBalancer.ingress[0]['hostname','ip']}" -n hono)" >> hono.env
echo "export MQTT_ADAPTER_IP=$(kubectl get service eclipse-hono-adapter-mqtt --output="jsonpath={.status.loadBalancer.ingress[0]['hostname','ip']}" -n hono)" >> hono.env
KAFKA_IP=$(kubectl get service eclipse-hono-kafka-0-external --output="jsonpath={.status.loadBalancer.ingress[0]['hostname','ip']}" -n hono)
KAFKA_TRUSTSTORE_PATH=/tmp/truststore.pem
kubectl get secrets eclipse-hono-kafka-example-keys --template="{{index .data \"ca.crt\" | base64decode}}" -n hono > ${KAFKA_TRUSTSTORE_PATH}
echo "export APP_OPTIONS='-H ${KAFKA_IP} -P 9094 -u hono -p hono-secret --ca-file ${KAFKA_TRUSTSTORE_PATH} --disable-hostname-verification'" >> hono.env
-
cat hono.env
-
PS C:\Users\Lenovo> cat hono.env export REGISTRY_IP=127.0.0.1 export HTTP_ADAPTER_IP=127.0.0.1 export MQTT_ADAPTER_IP=127.0.0.1 export APP_OPTIONS='-H (host name/IP address) -P 9094 -u hono -p hono-secret --ca-file /tmp/truststore.pem --disable-hostname-verification' PS C:\Users\Lenovo>
注册设备
当设备尝试连接到Hono的一个协议适配器时,协议适配器首先尝试使用设备注册表中保存的信息对设备进行身份验证。注册表中维护的信息包括设备所属的租户(逻辑范围)、设备在租户中的唯一身份以及设备用于身份验证的凭据。在设备可以连接到Hono并发布任何数据之前,需要将相应信息添加到设备注册表中。
创建新租户
# in the folder that contains the hono.env file
source hono.env
curl -i -X POST -H "content-type: application/json" --data-binary '{
"ext": {
"messaging-type": "kafka"
}
}' http://${REGISTRY_IP}:28080/v1/tenants
- 响应
HTTP/1.1 201 Created
etag: c7bc64fe-af7c-43d9-826c-3ea1b9d141ef
location: /v1/tenants/a91fd37e-0749-4813-8141-79b0ec38dcd3
content-type: application/json; charset=utf-8
content-length: 45
{"id":"a91fd37e-0749-4813-8141-79b0ec38dcd3"}
将生成的ID 保存到env文件中
echo "export MY_TENANT=a91fd37e-0749-4813-8141-79b0ec38dcd3" >> hono.env
向租户添加设备
curl -i -X POST http://${REGISTRY_IP}:28080/v1/devices/${MY_TENANT}
- 响应
HTTP/1.1 201 Created
etag: 222e13c2-8687-4417-b846-ea401e0aae5e
location: /v1/devices/a91fd37e-0749-4813-8141-79b0ec38dcd3/5fba4a75-903b-4dea-85cb-4e15cc60b201
content-type: application/json; charset=utf-8
content-length: 45
{"id":"5fba4a75-903b-4dea-85cb-4e15cc60b201"}
将生成的ID 保存到env文件中
echo "export MY_DEVICE=5fba4a75-903b-4dea-85cb-4e15cc60b201" >> hono.env
设置设备密码
准备一个密码放入 env 文件中
# in directory that contains the hono.env file
echo "export MY_PWD=ofbiz" >> hono.env
source hono.env
curl -i -X PUT -H "content-type: application/json" --data-binary '[{
"type": "hashed-password",
"auth-id": "'${MY_DEVICE}'",
"secrets": [{
"pwd-plain": "'${MY_PWD}'"
}]
}]' http://${REGISTRY_IP}:28080/v1/credentials/${MY_TENANT}/${MY_DEVICE}
- 响应
HTTP/1.1 204 No Content
etag: 81cf17ee-e602-4243-9ac6-019a7e4b699b
content-type: application/json; charset=utf-8
启动下游示例应用程序
设备生成的遥测数据通常由下游应用程序使用,这些应用程序使用这些数据来实现其相应的业务功能。在本指南中,我们将使用Hono命令行客户端来模拟此类应用程序。客户端将连接到Hono向北的遥测和事件API,订阅所有遥测和事件消息,并将消息记录到控制台。
下载 hono-cli-*-exec.jar
打开一个新的终端窗口,从命令行运行客户端。
java -jar hono-cli-*-exec.jar app ${APP_OPTIONS} consume --tenant ${MY_TENANT}
应该是jdk版本太低 , 导致无法运行
-
切换到jdk17
-
Lenovo@DESKTOP-RBQ4DFJ MINGW64 ~ $ java -version java version "17.0.4.1" 2022-08-18 LTS Java(TM) SE Runtime Environment (build 17.0.4.1+1-LTS-2) Java HotSpot(TM) 64-Bit Server VM (build 17.0.4.1+1-LTS-2, mixed mode, sharing) Lenovo@DESKTOP-RBQ4DFJ MINGW64 ~ $ source hono.env $ java -jar hono-cli-*-exec.jar app ${APP_OPTIONS} consume --tenant ${MY_TENANT} Lenovo@DESKTOP-RBQ4DFJ MINGW64 ~ Connecting to Kafka based messaging infrastructure [127.0.0.1:9094] ${MY_TENANT} Consuming messages for tenant [a91fd37e-0749-4813-8141-79b0ec38dcd3], ctrl-c to exit.
将数据发布到HTTP
现在下游应用程序正在运行,设备可以开始使用Hono的协议适配器发布遥测数据和事件。首先,您将使用HTTP协议模拟向Hono发布数据的设备。
curl -i -u ${MY_DEVICE}@${MY_TENANT}:${MY_PWD} -H 'Content-Type: application/json' --data-binary '{"temp": 5}' http://${HTTP_ADAPTER_IP}:8080/telemetry
- 响应
HTTP/1.1 202 Accepted
content-length: 0
如果您已经如上所述启动了下游应用程序,那么您现在应该看到遥测消息被输出到另一个终端中的应用程序控制台。输出应如下所示
t 5fba4a75-903b-4dea-85cb-4e15cc60b201 application/json {"temp": 5} {orig_adapter=hono-http, qos=0, device_id=5fba4a75-903b-4dea-85cb-4e15cc60b201, creation-time=1665396904870, traceparent=00-7ff3be9757c80ece434cf919c0b431d6-0c445927bb82d302-01, content-type=application/json, orig_address=/telemetry}
将事件发布到HTTP
curl -i -u ${MY_DEVICE}@${MY_TENANT}:${MY_PWD} -H 'Content-Type: application/json' --data-binary '{"alarm": "fire"}' http://${HTTP_ADAPTER_IP}:8080/event
同样,可以看到事件被记录到下游应用程序的控制台。
e 5fba4a75-903b-4dea-85cb-4e15cc60b201 application/json {"alarm": "fire"} {orig_adapter=hono-http, qos=1, device_id=5fba4a75-903b-4dea-85cb-4e15cc60b201, creation-time=1665397019453, traceparent=00-32e97448b29bfa60be9eb1ac87313299-ed043b8a05c21fb4-01, content-type=application/json, orig_address=/event}
将数据发送到MQTT
安装Mosquitto
可以使用mosquito_pub命令行客户端 , 下载地址
找到Mosquitto Broker,若为启动状态,点击“停止”,然后右键属性设置为手动启动。
若还是不行,则1883端口被占用了。
命令行查询:netstat -ano | findstr 1883
杀掉进程的命令:taskkill /pid xxx /f
如果无法删除,可以通过搜索cmd,用管理员权限打开,然后输入命令终止进程
mosquitto_pub -h 127.0.0.1 -u 5fba4a75-903b-4dea-85cb-4e15cc60b201@a91fd37e-0749-4813-8141-79b0ec38dcd3 -P ofbiz -t telemetry -m '{"temp":5}'
同样,您现在应该看到消息被记录到下游应用程序的控制台
将事件发送到MQTT
mosquitto_pub -h 127.0.0.1 -u 5fba4a75-903b-4dea-85cb-4e15cc60b201@a91fd37e-0749-4813-8141-79b0ec38dcd3 -P ofbiz -t event -q 1 -m '{"alarm": "fire"}'
将命令发送到设备
Hono的高级功能, 应用程序向设备发送命令并接收响应,以及在设备上处理命令的结果。这里的通信方向与遥测和事件完全相反。
接收命令
使用mosquito_sub命令可以模拟接收命令的MQTT设备。在终端中为模拟设备创建命令主题订阅:
# in directory that contains the hono.env file
source hono.env
mosquitto_sub -v -h 127.0.0.1 -u 5fba4a75-903b-4dea-85cb-4e15cc60b201@a91fd37e-0749-4813-8141-79b0ec38dcd3 -P ofbiz -t command///req/#
现在设备正在等待接收命令,应用程序可以开始发送命令。在新的终端窗口中,启动命令行客户端:
# in directory where the hono-cli-*-exec.jar file has been downloaded to
java -jar hono-cli-*-exec.jar app ${APP_OPTIONS} command
在提示符下,输入以下命令以向设备发送带有JSON负载的单向命令:
ow --tenant ${MY_TENANT} --device ${MY_DEVICE} -n setVolume --payload '{"level": 50}'
-
当然 , 以上也可以在PostMan中进行调用