import osimport sysimport threadingimport requestsfrom collections import defaultdictfrom alibabacloud_iot20180120.client import Client as Iot20180120Clientfrom alibabacloud_iot20180120.models import QueryDeviceDetailResponseBodyData, QueryDeviceByStatusResponseBody, \ BatchQueryDeviceDetailResponseBodyDatafrom alibabacloud_tea_openapi import models as open_api_modelsfrom alibabacloud_iot20180120 import models as iot_20180120_modelsstatusList = [1, 3]endpoints = { '中国': 'iot.cn-shanghai.aliyuncs.com', '东南亚': 'iot.ap-southeast-1.aliyuncs.com', '美国': 'iot.us-east-1.aliyuncs.com', '欧洲': 'iot.eu-central-1.aliyuncs.com'}class Sample: def __init__(self): pass @staticmethod def create_client(endpoint) -> Iot20180120Client: """ 使用AK&SK初始化账号Client @author:WHN @param: endpoint:区服 @return: Client """ config = open_api_models.Config( # 您的AccessKey ID, access_key_id='填入您的AccessKey ID', # 您的AccessKey Secret, access_key_secret='填入您的AccessKey Secret' ) # 访问的域名 config.endpoint = endpoints[endpoint] return Iot20180120Client(config) @staticmethod def query_device_detail(area: str, iot_id: str) -> QueryDeviceDetailResponseBodyData: """ 查询指定设备的详细信息 @author:WHN @param area:区服标识 @param iot_id:设备ID @return: QueryDeviceDetailResponseBodyData """ client = Sample.create_client(area) query_device_detail_request = iot_20180120_models.QueryDeviceDetailRequest( iot_id=iot_id ) response = client.query_device_detail(query_device_detail_request) return response.body.data @staticmethod def batch_query_device_detail(area: str, product_key: str, device_name: list) -> list[BatchQueryDeviceDetailResponseBodyData] | None: """ 批量查询指定设备的详细信息,每次最多100个设备 @author:WHN @param area:区服标识 @param product_key:ProductKey @param device_name:设备名称集合 @return: BatchQueryDeviceDetailResponseBodyDataData """ client = Sample.create_client(area) batch_query_device_detail_request = iot_20180120_models.BatchQueryDeviceDetailRequest( device_name=device_name, product_key=product_key ) response = client.batch_query_device_detail(batch_query_device_detail_request) return response.body.data.data @staticmethod def query_device_by_status( area: str, status: int, page_size: int, current_page: int ) -> QueryDeviceByStatusResponseBody: """ 根据设备状态查询设备列表,传入Status=1或3查询已激活的设备 @author:WHN @param area:区服标识 @param status:区服标识设备状态。可选值:0:未激活 1:在线 3:离线 8:已禁用 @param page_size:每页显示的记录数量,最大值是50。默认值是10 @param current_page:当前页数,默认值是 1 @return: QueryDeviceResponseBody """ client = Sample.create_client(area) query_device_by_status_request = iot_20180120_models.QueryDeviceByStatusRequest( status=status, page_size=page_size, current_page=current_page ) response = client.query_device_by_status(query_device_by_status_request) return response.body# 阿里API:根据设备状态查询设备列表 + 批量查询指定产品下多个设备的详细信息def batch_cloud_order_device(area, iotIdList): try: device = [] for status in statusList: statusResponsePage = Sample.query_device_by_status(area, status, 50, 1) # 循环分页查询在线、离线的设备 for currentPage in range(1, statusResponsePage.page_count): statusResponse = Sample.query_device_by_status(area, status, 50, currentPage).data.to_map().get( 'SimpleDeviceInfo') # 根据product_key分组 product_key_map = defaultdict(list) for statusData in statusResponse: product_key_map[statusData['ProductKey']].append(statusData) for key in product_key_map: # 批量获取device_name deviceNameList = [i['DeviceName'] for i in product_key_map.get(key)] deviceDetailList = Sample.batch_query_device_detail(area, key, deviceNameList) # 根据product_key、device_name集合,批量查询指定设备的详细信息 for deviceData in deviceDetailList: deviceDetail = deviceData.to_map() deviceDetail['area'] = area if deviceDetail['IotId'] in iotIdList: deviceDetail['isOrder'] = 1 if area == 'cn': # 根据ip获取地理位置 location = getLocPyGaoDe(deviceDetail['IpAddress']) deviceDetail['province'] = location['province'] deviceDetail['city'] = location['city'] device.append(deviceDetail) print(deviceDetail) print('area:', area, ' deviceSize:', len(device)) return device except BaseException as e: print(e)class myThread (threading.Thread): def __init__(self, area, iotIdList): threading.Thread.__init__(self) self.result = None self.area = area self.iotIdList = iotIdList def run(self): self.result = batch_cloud_order_device(self.area, self.iotIdList) def get_result(self): return self.resultif __name__ == '__main__': # 查询设备索引 iotIdList = select_order_device() device = [] endpointList = endpoints.keys() threadList = [] # 循环创建多个子线程 for area in endpointList: thread = myThread(area, device) # 要先start thread.start() threadList.append(thread) for thread in threadList: # 然后再join,才能保证多个子线程同步进行 thread.join() # 子线程结束后,汇总数据 device.extend(thread.get_result()) print("退出主线程") print(len(device))