فهرست منبع

注册证书时,新增设备影子规则

chenshibin 4 سال پیش
والد
کامیت
430677f6c8
2فایلهای تغییر یافته به همراه28 افزوده شده و 1 حذف شده
  1. 3 0
      Ansjer/config.py
  2. 25 1
      Object/IOTCore/IotObject.py

+ 3 - 0
Ansjer/config.py

@@ -173,11 +173,14 @@ AWS_IOT_SES_ACCESS_FOREIGN_SECRET = '9Ika2f6wRCZice+0/Z86c0hD7wMd9pyrAuLCsqeV'
 AWS_IOT_SES_ACCESS_FOREIGN_REGION_AMERICA = 'us-east-1'
 AWS_IOT_SES_ACCESS_FOREIGN_REGION_ASIA = 'ap-southeast-1'
 AWS_IOT_SES_ACCESS_FOREIGN_REGION_EUROPE = 'eu-west-1'
+AWS_IOT_SES_ACCESS_FOREIGN_ROLE = 'arn:aws:iam::697864307463:role/Ansjer_Iot_Admin'
+
 
 # Iot Core国内
 AWS_IOT_SES_ACCESS_CHINA_ID = 'AKIA2MMWBR4DUUYPCFNJ'
 AWS_IOT_SES_ACCESS_CHINA_SECRET = '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'
 AWS_IOT_SES_ACCESS_CHINA_REGION = 'cn-northwest-1'
+AWS_IOT_SES_ACCESS_CHINA_ROLE = 'arn:aws-cn:iam::713816116999:role/service-role/Ansjer_Iot_Admin'
 
 IOT_HOST = {
     1: 'a250bbr0p9u7as-ats.iot.cn-northwest-1.amazonaws.com.cn',

+ 25 - 1
Object/IOTCore/IotObject.py

@@ -4,10 +4,12 @@ import json
 from abc import ABCMeta,abstractmethod
 
 import boto3
+from awscrt import mqtt
 
 from Ansjer.config import AWS_IOT_SES_ACCESS_CHINA_REGION, AWS_IOT_SES_ACCESS_CHINA_ID, AWS_IOT_SES_ACCESS_CHINA_SECRET, \
     AWS_IOT_SES_ACCESS_FOREIGN_REGION_AMERICA, AWS_IOT_SES_ACCESS_FOREIGN_ID, AWS_IOT_SES_ACCESS_FOREIGN_SECRET, \
-    AWS_IOT_SES_ACCESS_FOREIGN_REGION_EUROPE, AWS_IOT_SES_ACCESS_FOREIGN_REGION_ASIA
+    AWS_IOT_SES_ACCESS_FOREIGN_REGION_EUROPE, AWS_IOT_SES_ACCESS_FOREIGN_REGION_ASIA, AWS_IOT_SES_ACCESS_CHINA_ROLE, \
+    AWS_IOT_SES_ACCESS_FOREIGN_ROLE
 
 
 class IOTObject(metaclass=ABCMeta):
@@ -30,24 +32,28 @@ class IOTClient(IOTObject):
                                        aws_access_key_id=AWS_IOT_SES_ACCESS_CHINA_ID,
                                        aws_secret_access_key=AWS_IOT_SES_ACCESS_CHINA_SECRET)
             self.endpoint = 'a250bbr0p9u7as-ats.iot.cn-northwest-1.amazonaws.com.cn'
+            self.iotrole = AWS_IOT_SES_ACCESS_CHINA_ROLE
 
         if region_id == 2:
             self.client = boto3.client('iot', region_name=AWS_IOT_SES_ACCESS_FOREIGN_REGION_ASIA,
                                        aws_access_key_id=AWS_IOT_SES_ACCESS_FOREIGN_ID,
                                        aws_secret_access_key=AWS_IOT_SES_ACCESS_FOREIGN_SECRET)
             self.endpoint = 'a2rqy12o004ad8-ats.iot.ap-southeast-1.amazonaws.com'
+            self.iotrole = AWS_IOT_SES_ACCESS_FOREIGN_ROLE
 
         if region_id == 3:
             self.client = boto3.client('iot', region_name=AWS_IOT_SES_ACCESS_FOREIGN_REGION_AMERICA,
                                        aws_access_key_id=AWS_IOT_SES_ACCESS_FOREIGN_ID,
                                        aws_secret_access_key=AWS_IOT_SES_ACCESS_FOREIGN_SECRET)
             self.endpoint = 'a2rqy12o004ad8-ats.iot.us-east-1.amazonaws.com'
+            self.iotrole = AWS_IOT_SES_ACCESS_FOREIGN_ROLE
 
         if region_id == 4:
             self.client = boto3.client('iot', region_name=AWS_IOT_SES_ACCESS_FOREIGN_REGION_EUROPE,
                                        aws_access_key_id=AWS_IOT_SES_ACCESS_FOREIGN_ID,
                                        aws_secret_access_key=AWS_IOT_SES_ACCESS_FOREIGN_SECRET)
             self.endpoint = 'a2rqy12o004ad8-ats.iot.eu-west-1.amazonaws.com'
+            self.iotrole = AWS_IOT_SES_ACCESS_FOREIGN_ROLE
 
 
 
@@ -151,6 +157,24 @@ class IOTClient(IOTObject):
                 templateBody=templateBody,
                 parameters=parameters
             )
+
+            self.client.create_topic_rule(
+                ruleName= 'Ansjer_Device_' + serial_number+'_LWT',
+                topicRulePayload={
+                    "sql": 'my/things/'+ 'Ansjer_Device_' + serial_number+'/shadow/update-lwt',
+                    "ruleDisabled": False,
+                    "awsIotSqlVersion": "2016-03-23",
+                    'actions': [
+                        {
+                            'republish': {
+                                'roleArn': self.iotrole,
+                                'topic': '$$aws/things/'+ 'Ansjer_Device_' + serial_number+'/shadow/update',
+                                'qos': mqtt.QoS.AT_LEAST_ONCE
+                            }
+                        }
+                    ]
+                }
+            )
             return res, parameters
         except Exception as e:
             print(e)