Bài toán tính chẵn lẻ


7

Gần đây tôi đã thực hiện một chút công việc tự động hóa nhà DIY (RF; 433 MHz) trên nhiều thiết bị khác nhau - hoạt động tốt cho tất cả ngoại trừ một thiết bị. Về cơ bản, nó là một robot hồ bơi với một số điều khiển từ xa thực sự nhảm nhí.

Tôi đã thu thập một số dữ liệu bằng BladeRF SDR và ​​GNU Radio. Cột "3 khác" về cơ bản là hành động, trong khi "1 khác" dường như là một số nối tiếp và "2 khác" định nghĩa robot nếu bạn có nhiều người sử dụng tôi đoán (một số người bạn của tôi có cùng giá trị khác ở đó). Tôi không chắc mục đích của bộ đếm là gì nhưng tôi sẽ đoán nó để robot biết khi nào phạm vi quá rộng (thiếu một số thông tin?). Tôi đã thu hẹp các byte và ý nghĩa của chúng, tuy nhiên tôi thất bại trong việc tính toán CRC (tổng kiểm tra) chính xác cho dữ liệu.

TUỔI - VUI LÒNG XEM CẬP NHẬT DƯỚI ĐÂY !!

Đây là một số dữ liệu mẫu:

<other1                  > <other2> <other3> <count > <crc   >      
10110100 00111110 10001111 11001000 00000001 11110111 01011110
10110100 00111110 10001111 11001000 00000001 11111000 01010011
10110100 00111110 10001111 11001000 00000001 11111001 01010100
10110100 00111110 10001111 11001000 00000001 11111010 01010001
10110100 00111110 10001111 11001000 00000001 11111011 01010010
10110100 00111110 10001111 11001000 00000001 11111100 01010111
10110100 00111110 10001111 11001000 00000001 11111101 01011000
10110100 00111110 10001111 11001000 00000001 11111110 01010101
10110100 00111110 10001111 11001000 00000001 11111111 01010110
10110100 00111110 10001111 11001000 00000001 00000000 01100111
10110100 00111110 10001111 11001000 00000001 00000001 01101000
10110100 00111110 10001111 11001000 00000001 00000010 01100101
10110100 00111110 10001111 11001000 00000001 00000011 01100110
10110100 00111110 10001111 11001000 00000001 00000101 01100100
10110100 00111110 10001111 11001000 00000001 00000111 01100010
added data:
10110100 00111110 10001111 11001000 00000010 00000110 01100100
10110100 00111110 10001111 11101010 00000010 01100101 10011010
10110100 00111110 10001111 11101010 00000001 01100100 10011100
10110100 00111110 10001111 11101010 00000001 01100011 10011101
10110100 00111110 10001111 11101010 00000001 01100110 10011010

Có một số lượng cho mỗi yêu cầu phải được thay đổi và một số lệnh được gửi, ví dụ: cột "3 khác" có thể đọc 00000010 thay vì 00000001.

Sẽ rất hữu ích nếu ai đó có thể cho tôi một số gợi ý về nơi để xem xét. Tôi đã thử các kỹ thuật khác nhau như XOR trên các byte hoặc tính toán modulo, v.v. - Tôi thậm chí đã thử các công cụ vũ lực thuật toán CRC khác nhau - thật không may là chưa thành công.

EDIT: Tôi đã đưa dữ liệu vào excel và thêm một số chức năng (về cơ bản, nó so sánh mỗi 4 bit với các dữ liệu ở trên - lần truyền cuối cùng). Tôi đã làm điều đó khi tôi nhận ra CRC vẫn giữ nguyên một lần. Đây là trường hợp khi cả hành động và số đếm được tăng lên 1. Xin hãy xem:

dữ liệu

CẬP NHẬT:

Tôi đã tìm thấy một số thông số kỹ thuật chi tiết khác. từ cùng một nhà cung cấp trên mạng sau khi tìm kiếm trong nhiều giờ và nó xuất hiện vì vậy CRC thực sự là một sự tương đương. Tôi cũng tinh chỉnh sơ đồ thu sóng vô tuyến gnu của mình và thu thập một số dữ liệu mới. Vui lòng bỏ qua dữ liệu trên và xem tại đây:

other 1> other 2                > other 3> other 4    > parity
10110100 001111101000111111101010 00000001 011110101001 0101
10110100 001111101000111111101010 00000001 011110111001 0110
10110100 001111101000111111101010 00000001 011111001001 0011
10110100 001111101000111111101010 00000001 011111011001 0100
10110100 001111101000111111101010 00000010 011111101001 0100
10110100 001111101000111111101010 00000010 011111111001 0011
10110100 001111101000111111101010 00000010 100000001001 0011
10110100 001111101000111111101010 00000010 100000011001 0100
10110100 001111101000111111101010 00000001 100000101001 0100
10110100 001111101000111111101010 00000001 100000111001 0011
10110100 001111101000111111101010 00000001 100001001001 0110
10110100 001111101000111111101010 00000001 100001011001 0101
10110100 001111101000111111101010 00000010 100001101001 0101
10110100 001111101000111111101010 00000010 100001111001 0110
10110100 001111101000111111101010 00000010 100010001001 1011
10110100 001111101000111111101010 00000010 100010011001 1100
10110100 001111101000111111101010 00000001 100010101001 1100
10110100 001111101000111111101010 00000001 100010111001 1011
10110100 001111101000111111101010 00000001 100011001001 1110
10110100 001111101000111111101010 00000001 100011011001 1101

Và đây là một lần nữa như excel ưa thích:

nhập mô tả hình ảnh ở đây

Có ai biết làm thế nào để tính chẵn lẻ đó? Tôi đã thử chia dữ liệu, v.v. và sử dụng các tính toán chẵn lẻ thông thường nhưng không may là chưa thành công.


1
Bạn không có đủ thông tin ở đây, vì điều duy nhất bạn từng thấy thay đổi bên cạnh giá trị kiểm tra là byte cuối cùng, số đếm. Do đó, bạn không thể phân biệt tác động của các byte trước so với một số giá trị bắt đầu tĩnh của thuật toán. Bạn có thể đưa ra một số dự đoán và có thể kiểm tra chúng, hoặc thậm chí có thể thấy một lý thuyết quá đẹp đến mức không thể xảy ra, nhưng tất cả những gì bạn thực sự có thể đảo ngược từ dữ liệu đã cho là vai trò của byte cuối cùng trong việc tạo giá trị kiểm tra.
Chris Stratton

2
@ChrisStratton Bạn nói đúng. Tôi đã thêm một số dữ liệu thay đổi các giá trị khác. Nó có hữu ích không
Brilliantavirus

1
Đẹp. Tôi sẽ ngạc nhiên, nhưng có thể có một số mã cuộn. Bạn đã xác nhận nếu phát lại đơn giản các ảnh chụp cũ có hiệu quả không? Hãy nghĩ rằng bạn sẽ cần phải tự trả lời câu hỏi này, nhưng nó sẽ là tài liệu tham khảo hữu ích.
Sean Houlihane

@SeanHoulihane Lúc đầu tôi cũng nghĩ vậy. Nhưng sau một số lần thất bại, tôi đã quản lý để gửi lại dữ liệu và nó đã được chấp nhận vì vậy tôi đã kết luận rằng không có mã cuộn hoặc một cái gì đó tương tự. Ý tôi là, theo cách đó có thể ghi lại toàn bộ 'bản phác thảo' các hành động và phát lại nó, nhưng điều đó không hiệu quả vì số đó phải được nâng lên một cách thích hợp mọi lúc (có một sự khác biệt của một số lượng vẫn được chấp nhận - như đã nói tôi giả sử vì dữ liệu bị mất cho các vấn đề phạm vi, v.v.) bởi vì nếu không, robot sẽ mất 'đồng bộ hóa' và cần phải được đưa trở lại và cắm vào trạm nối của mình.
Brilliantavirus

1
@MikaelFalkvidd Đó là một ý tưởng hay và thường là điểm khởi đầu của tôi khi có sẵn. Thật không may vì đây là một thiết bị châu Âu không có id FFC hoặc có sẵn tương tự.
Brilliantavirus

Câu trả lời:


5

Ôi trời, đừng hỏi tôi như thế nào nhưng tôi nghĩ tôi đã hiểu ra rồi.

Chúng ta hãy có một cái nhìn:

nhập mô tả hình ảnh ở đây

Về cơ bản, bạn chia dữ liệu thành các gói 4 bit mỗi. Sau đó, bạn ghép từng chữ cái đầu tiên, thứ hai, thứ ba và thứ tư với nhau. Điều này có thể được nhìn thấy trong các cột 1, 2, 3 và 4. Sau đó, bạn đếm số 1 trong mỗi số đó (số lượng được viết bên cạnh mỗi số đó). Nếu chúng thậm chí là 0 cho bit chẵn lẻ, nếu chúng là số lẻ thì nó là một. Vì vậy, trước khi kết thúc, bây giờ bạn phải thêm nhị phân 1 vào kết quả từ trước (!). Điều đó phù hợp với từng thời điểm và tôi đã có thể tạo thành công các khung hình của riêng mình theo cách đó. Vấn đề có vẻ như đã được giải quyết. Hoàn hảo. Cảm ơn mọi người đã đóng góp.


1
Nói cách khác, kiểm tra nibble là một XOR của tất cả những cái trước đó.
Chris Stratton

1
@ChrisStratton Trả lời câu hỏi này nhưng chính xác những gì cần phải là XOR'd? Tôi đã thử từng khối chẵn lẻ từ các danh mục nhưng điều đó không hiệu quả.
Brilliantavirus

1
XOR mỗi trong số các ngòi nổ thành một bộ tích lũy ban đầu bằng không và bạn sẽ có câu trả lời của mình. Điều này để lại cho bạn một cái ở mỗi vị trí bit nếu số lượng cái ở vị trí đó là số lẻ.
Chris Stratton

1
Tối ưu hóa đơn thuần - bạn đã tự mình tìm ra yêu cầu :-)
Chris Stratton

@ChrisStratton Phải, tuy nhiên cách tiếp cận XOR rõ ràng là cách tiếp cận chính xác và tôi đã thực hiện nó một cách dễ dàng theo cách đó trong python. Dù sao, +1 ở cuối vẫn là cần thiết. Bạn có biết tại sao?
Brilliantavirus
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.