В случае использования, в котором inte rnet и традиционная сеть WLAN невозможны, я пытаюсь обмениваться данными между узлами с помощью нескольких смартфонов. Я хочу сделать это с помощью функций синхронизации PouchDB и CouchDB. Узлы (raspberry pi's) генерируют уникальные данные и сохраняют их в своей базе данных CouchDB. На смартфонах используется приложение Angular / Ioni c 4, которое реализует PouchDB.
Несмотря на то, что невозможно создать сеть WLAN между узлами, - это возможность подключения смартфонов к узлам с помощью WiFi: все узлы создают точку доступа WiFi. Все они имеют одинаковый SSID и IP-адрес. Кроме того, все узлы изолированы друг от друга.
Пример сценария
Сначала PouchDB смартфона пуста. Затем смартфон подключается к точке доступа узла 1, что позволяет им выполнять двустороннюю синхронизацию c. Таким образом, смартфон теперь содержит данные узла 1 в своем PouchDB. CouchDB узла 1 не получает дополнительные данные, потому что PouchDB смартфона была пуста.
Далее смартфон 1 подключается к узлу 2 и синхронизируется. Смартфон должен теперь иметь данные узла 1 и узла 2 в своем PouchDB. CouchDB узла 2 теперь должна иметь свои собственные данные и данных узла 1, потому что смартфон был в своем PouchDB.
Проблема
По какой-то причине PouchDB смартфона только «вытягивает» данные из узлов, но не «выталкивает» данные, которые имеются у других узлов. Таким образом, в приведенном выше примере смартфон заканчивается данными узлов 1 и 2, но узел 2 имеет только свои собственные данные. Данные узла 1 не передаются на узел 2. Я не вижу никаких сообщений об ошибках, и я действительно не знаю, что может быть причиной этой проблемы.
Код
Код, который я использую, основан на этом блоге. Я использую сервис с именем 'PouchService', который обрабатывает синхронизацию:
export class PouchService {
data: any;
db: any;
remote: any;
constructor(public app: ApplicationRef, public http: HttpClient) {
this.db = new PouchDB("eventory");
this.remote = "http://192.168.4.1:5984/eventorydb";
let options = {
live: true,
retry: true,
continuous: true,
auto_compaction: true,
};
this.db.sync(this.remote, options);
Таким образом, смартфон создает локальную PouchDB с именем "eventory", а удаленная база данных называется "eventorydb", которая одинакова для все узлы, чтобы смартфон мог автоматически подключаться к базе данных. Для выполнения синхронизации используется следующий код:
getProducts() {
if (this.data) {
return Promise.resolve(this.data);
}
return new Promise(resolve => {
this.db
.allDocs({
include_docs: true
})
.then(result => {
this.data = [];
let docs = result.rows.map(row => {
this.data.push(row.doc);
});
resolve(this.data);
this.db
.changes({ live: true, since: "now", include_docs: true })
.on("change", change => {
this.handleChange(change);
});
})
.catch(error => {
console.log(error);
});
});
}
Обнаруженные изменения обрабатываются следующим образом:
handleChange(change) {
let changedDoc = null;
let changedIndex = null;
this.data.forEach((doc, index) => {
if (doc._id === change.id) {
changedDoc = doc;
changedIndex = index;
}
});
//A document was deleted
if (change.deleted) {
this.data.splice(changedIndex, 1);
this.app.tick();
} else {
//A document was updated
if (changedDoc) {
this.data[changedIndex] = change.doc;
this.app.tick();
}
//A document was added
else {
this.data.push(change.doc);
this.app.tick();
}
}
}
Если что-то неясно, пожалуйста, дайте мне знать, и я сообщу предоставить больше информации!