Commit 7451c7ec by 汤文兵

init

parents
Pipeline #747 failed with stage
in 28 seconds
{
"presets": [
["env", {
"targets": {
"node": true
}
}]
],
"plugins": ["transform-decorators-legacy"]
}
node_modules
.idea
yarn.lock
deploy:
stage: deploy
only:
- tags
variables:
SERVICE_GROUP: "iot"
SERVICE_NAME: "iot-pub"
PUBLISH_PORT: "31000"
script:
- export IMAGE_TAG=$SERVICE_NAME:$CI_COMMIT_REF_NAME
- docker build -t $IMAGE_TAG .
- export ALI_KEY=$ALI_KEY
- export ALI_SECRET=$ALI_SECRET
- sed -i 's/SERVICE_NAME/'$SERVICE_NAME'/' docker-compose.yml
- docker stack deploy -c docker-compose.yml $SERVICE_GROUP
FROM registry.cn-hangzhou.aliyuncs.com/ugen-app/ugen-core:4.2.2
WORKDIR /data
COPY ./package.json .
RUN yarn --regsitry=http://192.168.2.91:7001
COPY . .
COPY core /data/node_modules/iot-cloud-core/core
CMD node start.js
const path = require('path');
module.exports = {
port: 3000,
provider:require(path.join(__dirname,"src","Provider")),
needLog:false,
serviceName:"/iot/ali",
communications:[
'SERVICE',
]
};
version: '3.7'
services:
SERVICE_NAME:
image: ${IMAGE_TAG}
ports:
- "${PUBLISH_PORT}:3000"
deploy:
replicas: 1
update_config:
order: start-first
resources:
limits:
cpus: '0.5'
memory: 300M
environment:
ALI_KEY: ${ALI_KEY}
ALI_SECRET: ${ALI_SECRET}
networks:
- ugen
networks:
ugen:
external: true
{
"dependencies": {
"@alicloud/pop-core": "^1.7.9",
"iot-cloud-core": "^4.3.1"
},
"devDependencies": {
"babel-plugin-transform-decorators-legacy": "^1.3.5"
}
}
#### 请求
* url https://service.iot.u-gen.net/iot/ali/pub
* 内网地址 http://192.168.2.91:31000/iot/ali/pub
* 支持post请求
* 请求body中 包括ProductKey,DeviceName和MessageContent
* {"DeviceName":"dev3","ProductKey":"a1zxV8TuyOr","MessageContent":"hello"}
* MessageContent为透明传输的明文
#### 验证算法
* 请求短需要的验证算法
* 请求url上必包含参数t,accesskey,sign 如https://service.iot.u-gen.net/iot/ali/pub?t=xxx&accessKey=xxx&sign=xxx%2FkilHJ6EgaR9+4T3a4ujyR0Y%3D
* t 时间戳(秒级) 过期时间15分钟
* accesskey 用户获得的公钥
* sign 算法如下
* 1.拼接字符串t=xxx&appkey=xxx&param1=xxx&param2=xxx 加上请求参数 按字母表从小到大排序
* 2.hamc sha256上述字符串accessSecret
* 3.最后base64结果,将结果urlencode
#### example
* 获取的accesskey为"1bUFDe0fNteowYZu%2BVGKvA"accessSecret为"N2U10D2DMWCMMD9V9Q%2BN%2FQ"
* 当前时间戳为 1578377192
* 请求参数为 {"DeviceName":"dev3","ProductKey":"a1zxV8TuyOr","MessageContent":"hello"}
* 拼接的字符串为t=1578377192&appkey=1bUFDe0fNteowYZu%2BVGKvA&DeviceName=dev3&ProductKey=a1zxV8TuyOr&MessageContent=hello
* 按ascii表从小到大排序为DeviceName=dev3&MessageContent=hello&ProductKey=a1zxV8TuyOr&accessKey=1bUFDe0fNteowYZu%2BVGKvA&t=1578377192
* 用 accessSecret为 对上述字符串进行hac sha256加密 结果为e0y1jRF2UN3Ud9ujYLz%2FkilHJ6EgaR9+4T3a4ujyR0Y=
* urlencode 上述字符串 结果为e0y1jRF2UN3Ud9ujYLz%2FkilHJ6EgaR9+4T3a4ujyR0Y%3D
* 最后加上sign=e0y1jRF2UN3Ud9ujYLz%2FkilHJ6EgaR9+4T3a4ujyR0Y%3D
const Provider = require('iot-cloud-core').BASE.Provider;
const public_class = require('./public/Public');
class IOTProvider extends Provider{
constructor(){
super("ApiSign");
this.setPublicClass(public_class);
}
}
module.exports = IOTProvider;
const Core = require('@alicloud/pop-core');
module.exports = new Core({
accessKeyId: process.env.ALI_KEY,
accessKeySecret: process.env.ALI_SECRET,
endpoint: process.env.ALI_ENDPOINT || 'https://iot.cn-shanghai.aliyuncs.com',
apiVersion: process.env.ALI_APIVERSION || '2018-01-20'
});
const PublicFunBase = require('iot-cloud-core').BASE.PublicFunBase;
const aliClient = require('../Util/aliClient');
const TOPIC = process.env.TOPIC || 'a1zxV8TuyOr';
const REGION = process.env.REGION || 'cn-shanghai';
class Public extends PublicFunBase{
async pub(data){
this.checkKeyExists(data.params,"ProductKey","DeviceName","MessageContent");
let MessageContent = Buffer.from(data.params.MessageContent).toString('base64');
let params = {
"RegionId": REGION,
"ProductKey": data.params.ProductKey,
"TopicFullName": `/${TOPIC}/${data.params.DeviceName}/user/down_raw`,
"MessageContent": MessageContent
};
// https://help.aliyun.com/document_detail/69793.html?spm=a2c4g.11186623.6.819.540d6a9bJZWNxu
try{
let res = await aliClient.request('Pub', params, {method: 'POST'});
if(res && res.Success){
return {
Success: true
}
}else{
return res;
}
}catch (e) {
// 阿里iot请求失败 如topic错误等原因
if(e.name){
return e.name
}else{
return 'request iot error'
}
}
}
}
module.exports = Public;
const ServiceManager = require('iot-cloud-fs');
require("babel-register")({
ignore: /node_modules\/(?!iot-cloud-publicAPI)/
});
const config = require('./config');
const SuperServer = require('iot-cloud-core').SERVER.SuperServer;
new SuperServer(config).start();
ServiceManager.init([{
name: "ApiSign",
host: "api-sign",
port: 3000
}]);
const ServiceManager = require('iot-cloud-fs');
require("babel-register")({
ignore: /node_modules\/(?!iot-cloud-publicAPI)/
});
const path = require('path');
const config = require(path.resolve("..","config.js"));
const SuperServer = require('iot-cloud-core').SERVER.SuperServer;
new SuperServer(config).start();
ServiceManager.init([{
name: "ApiSign",
host: "127.0.0.1",
port: 3001
}]);
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment